package ModuloCliente;

import java.util.*;
import java.io.*;
import ModuloFuncionario.TelaFuncionario;
import Pessoa.Endereco;
import Pessoa.Telefone;

public class TelaCliente {
	
	private static Scanner Read = new Scanner(System.in);
    private static FachadaCliente fachadaCliente = FachadaCliente.getInstancia();
    private static Console console = System.console();
    
    
    // Menu principal
    public static void menuCliente(){
    	apagaTela();
    	System.out.println("-------------------------------------");
		System.out.println("****** SOFTWARE VIDEO LOCADORA ******");
		System.out.println("-------------------------------------");
    	System.out.println("****** MENU CADASTRO CLIENTES *******");
    	System.out.println("-------------------------------------\n");
        System.out.println("[1] Buscar Cliente");
        System.out.println("[2] Cadastrar Cliente");
        System.out.println("[3] Cadastrar Dependente");
        System.out.println("[4] Atualizar Cliente");
        System.out.println("[5] Remover Cliente");
        System.out.println("[6] Remover Dependente");
        System.out.println("[0] Menu Inicial");
        System.out.print("Opcao: ");
        char opcao = Read.next().charAt(0);
        
        switch(opcao) {
            case '1': buscarCliente();
            break;
            case '2': cadastrarCliente();
            break;
            case '3': cadastrarDependente();
        	break;
            case '4': atualizarCliente();
            break;
            case '5': removerCliente();
            break;
            case '6': removerDependente();
            break;
            case '0': TelaFuncionario.menuFuncionario();
            break;
            default: 
            	System.out.println("* opcao invalida! press <<Enter>>");
            	console.readLine();
        		menuCliente();
        }
    } // Termino do menu principal
    
    // metodo apaga tela
    private static void apagaTela(){
    	System.out.print( "\033[H\033[2J" ); 
    }
    
    // Metodo cadastrar cliente
    private static void cadastrarCliente(){

    	String cpf = null;
    	char opcao = 0;   	 	
    	boolean cpfValido = false;
    		
    		apagaTela();
    		System.out.println("--------------------------------------");
    		System.out.print("Digite o CPF (Apenas numeros): ");
    		cpf = console.readLine();
    		
    		cpfValido = Util.Validador.validaCPF(cpf);
    		
    		if (!cpfValido) {
    			
    			System.out.println("* CPF invalido!");
    			do {
    				System.out.println("--------------------------------------");
    				System.out.println("[1] Digitar novamente [2] Menu");
    				System.out.print("Opcao: ");
    				opcao = Read.next().charAt(0);   				
    				if(opcao !='1' && opcao !='2'){
    					System.out.println("opcao invalida! press <<Enter>>");
    				}
    			}while(opcao != '1' && opcao != '2');
    			
    			if(opcao == '1'){
    				cadastrarCliente();
    			} else if (opcao == '2') {
    				menuCliente();
    			}
    			
    		}

    	boolean formulario = false;
    	
    	if(cpfValido){
    		if(fachadaCliente.pesquisarCpf(cpf)){ // verifica se o cpf ja esta cadastrado no sistema
    			System.out.println("* O CPF digitado ja esta cadastrado! press <<Enter>>");
    			console.readLine();
    			menuCliente();	
    		} else {
    			formulario = true;
    		}
    	}
    	
    	if (formulario && cpfValido){// Inicio do formulario
        	apagaTela();
    		System.out.println("-------------------------------------");
    		System.out.println("** DADOS PESSOAIS **");
    		System.out.println("-------------------------------------");
    		System.out.println("CPF: " + cpf);
    		System.out.print("Nome: ");
    		String nome = console.readLine().toUpperCase();
    		System.out.print("Idade: ");
    		String idade = console.readLine();
    		System.out.print("Sexo: ");
    		String sexo = console.readLine();
    	
    		System.out.println("-------------------------------------");
    		System.out.println("** ENDERECO **");
    		System.out.println("-------------------------------------");
    		System.out.print("Logradouro: ");
    		String Logradouro = console.readLine();
    		System.out.print("Numero: ");
    		String numero = console.readLine();
    		System.out.print("Bairro: ");
    		String bairro = console.readLine();
    		System.out.print("Cidade: ");
    		String cidade = console.readLine();
    		System.out.print("CEP: ");
    		String cep = console.readLine();
    	
    		Endereco endereco = new Endereco(Logradouro, numero, bairro, cidade, cep);
    	
    		System.out.println("-------------------------------------");
    		System.out.println("** CONTATOS **");
    		System.out.println("-------------------------------------");
    		System.out.print("Telefone residencial: ");
    		String residencial = console.readLine();
    		System.out.print("Telefone celular: ");
    		String celular = console.readLine();
    		System.out.print("Email: ");
    		String email = console.readLine();
    		System.out.println("-------------------------------------");
       	
    		Telefone telefone = new Telefone(residencial, celular);

    			do {
    				System.out.print("Deseja salvar? S/N: ");
    				opcao = Read.next().toUpperCase().charAt(0);
    				if(opcao == 'S'){
    					if(fachadaCliente.cadastrarCliente(new Cliente(nome, cpf, idade, sexo, endereco,telefone, email))){
    						System.out.println("* Cadastrado com sucesso! press <<Enter>>");
    					} else {
    						System.out.println("* Erro ao cadastrar! press <<Enter>>");
    					}
    				} else if (opcao != 'S' && opcao != 'N') {
    					System.out.println("Opcao invalida! press <<Enter>>");
    				}
    			} while(opcao != 'S' && opcao != 'N');	
       	
    			endereco = null;
    			telefone = null;
    			console.readLine();
    			System.out.print("Press <<Enter>>");
    			menuCliente();
    	} //Termino do formulario
    	
    } // Termino do metodo inserir novo cliente
    
    private static void cadastrarDependente(){
    		
    		System.out.println();
    		System.out.print("Digite o CPF do titular: ");
    		String cpf = console.readLine();
    		
    		if(fachadaCliente.pesquisarCpf(cpf)){
    			apagaTela();
    			System.out.println("------------------------------------------------");
    			System.out.println("Cliente titular: " + fachadaCliente.buscarCliente(cpf).getNome());
    			System.out.println("------------------------------------------------");
    			System.out.print("Nome do dependente: ");
    			String nomeDependente = console.readLine();
    			System.out.print("Parentesco: ");
    			String parentesco = console.readLine();
    			Dependente d = new Dependente(nomeDependente, parentesco, cpf);
    				if(fachadaCliente.cadastrarDependente(d)){
    					System.out.print("* Dependente inserido com sucesso! press <<Enter>>");
    					console.readLine();
    	    			menuCliente();
    				}
    		} else {
    			System.out.println("CPF nao encontrado! press <<Enter>>");
    			console.readLine();
    			menuCliente();
    		}
    	
    }
    
    private static void buscarCliente(){
    	System.out.println();
    	System.out.print("Digite o CPF para busca: ");
    	String cpf = console.readLine();
    	Cliente c = fachadaCliente.buscarCliente(cpf);
    	if( c != null ){
    		Vector<Dependente> dependentes = fachadaCliente.buscarDependente(cpf);
    		apagaTela();
    		System.out.println("---------------------------------------------------------------");
    		System.out.println("----------------------- DADOS PESSOAIS ------------------------\n");
        	System.out.println("Nome:" + c.getNome() + "   -   Idade: " + c.getIdade());
        	System.out.println("CPF: " + c.getCpf() + "   -   Sexo: " + c.getSexo());
        	System.out.println("-------------------------- ENDERECO ---------------------------\n");
        	System.out.println("Logradouro: " + c.getEndereco().getLogradouro() + ",   Nº"+ c.getEndereco().getNumero());
        	System.out.println("Bairro: " + c.getEndereco().getBairro() + ",  Cidade: " + c.getEndereco().getCidade());
        	System.out.println("CEP: " + c.getEndereco().getCep());
        	System.out.println("-------------------------- CONTATOS ---------------------------\n");
           	System.out.println("Telefone residencial: " + c.getTelefone().getResidencial());
           	System.out.println("Telefone celular: " + c.getTelefone().getCelular());
           	System.out.println("Email: " + c.getEmail());
           	System.out.println("------------------------ DEPENDENTES --------------------------\n");
    			for (int i = 0 ; i < dependentes.size() ; i++){
    				System.out.println((i+1) + ". " + dependentes.get(i).getNome() +
    						",  Parentesco: " + dependentes.get(i).getParentesco());
    			}
    		System.out.println("---------------------------------------------------------------");
    			System.out.print("  Press <<Enter>>");
    	} else {
    		System.out.println("* Cliente não encontrado! press <<Enter>> ");
    	}
    	console.readLine();
		menuCliente();
    }
    
    private static void atualizarCliente(){
    	
    	Cliente cliente = null;
    	Endereco endereco = null;
    	Telefone telefone = null;
    	String nome = null;
    	String idade = null;
    	String sexo = null;
	    String logradouro = null;
    	String numero = null;
     	String bairro = null;
    	String cidade = null;
    	String cep = null;
    	String residencial = null;
    	String celular = null;
       	String email = null;
       	int cont = 0;
    	char opcao;
    	
    	System.out.println();
    	System.out.print("Digite o cpf do cliente: ");
    	String cpf = console.readLine();
    	
    	if(fachadaCliente.pesquisarCpf(cpf)){ // If principal verifica se o cliente existe
    		
    		cliente = fachadaCliente.buscarCliente(cpf);
    		apagaTela();
    		System.out.println("-------------------------------------");
        	System.out.println("** DADOS PESSOAIS **");
        	System.out.println("-------------------------------------");
        	System.out.println("Nome:" + cliente.getNome() + "   -   Idade: " + cliente.getIdade());
        	System.out.println("CPF: " + cliente.getCpf() + "   -   Sexo: " + cliente.getSexo());
          	System.out.println("-------------------------------------");
        	
           	do {
           		System.out.print("Deseja alterar estes dados? S/N: ");
           		opcao = Read.next().toUpperCase().charAt(0);
           		if(opcao == 'S'){ // Verifica se o usuario deseja alterar os dados exibidos
           			apagaTela();
           			System.out.println("-------------------------------------");
           			System.out.print("Nome: ");
           	    	nome = console.readLine().toUpperCase();
           	    	System.out.print("Idade: ");
           	    	idade = console.readLine();
           	    	System.out.print("Sexo: ");
           	    	sexo = console.readLine();
           			
           		} else if ( opcao == 'N') {
           			nome = cliente.getNome();
           			idade = cliente.getIdade();
           			sexo = cliente.getSexo();
           			cont++;
           		} else {
           			System.out.println("Opcao invalida! press <<Enter>>");
           		}
           		
           	} while(opcao != 'S' && opcao != 'N');	
        	
        	apagaTela();
        	System.out.println("-------------------------------------");
        	System.out.println("** ENDERECO **");
        	System.out.println("-------------------------------------");
        	System.out.println("Logradouro: " + cliente.getEndereco().getLogradouro() + ",   Nº"+ cliente.getEndereco().getNumero());
        	System.out.println("Bairro: " + cliente.getEndereco().getBairro() + ",  Cidade: " + cliente.getEndereco().getCidade());
        	System.out.println("CEP: " + cliente.getEndereco().getCep());
        	System.out.println("-------------------------------------");
        	
        	do {
           		System.out.print("Deseja alterar estes dados? S/N: ");
           		opcao = Read.next().toUpperCase().charAt(0);
           		if(opcao == 'S'){
           			apagaTela();
           			System.out.println("-------------------------------------");
           			System.out.print("Logradouro: ");
           	    	logradouro = console.readLine();
           	    	System.out.print("Numero: ");
           	    	numero = console.readLine();
           	    	System.out.print("Bairro: ");
           	    	bairro = console.readLine();
           	    	System.out.print("Cidade: ");
           	    	cidade = console.readLine();
           	    	System.out.print("CEP: ");
           	    	cep = console.readLine();
           	    	
           	    	endereco = new Endereco(logradouro, numero, bairro, cidade, cep);
           			
           		} else if ( opcao == 'N') {
           			logradouro = cliente.getEndereco().getLogradouro();
           			numero = cliente.getEndereco().getNumero();
           			bairro = cliente.getEndereco().getBairro();
           			cidade = cliente.getEndereco().getCidade();
           			cep = cliente.getEndereco().getCep();
           			cont++;
           			endereco = new Endereco(logradouro, numero, bairro, cidade, cep);
           			
           		} else {
           			System.out.println("Opcao invalida!");
           		}
           		
           	} while(opcao != 'S' && opcao != 'N');	
        	
        	apagaTela();
        	System.out.println("-------------------------------------");
        	System.out.println("** CONTATOS **");
        	System.out.println("-------------------------------------");
           	System.out.println("Telefone residencial: " + cliente.getTelefone().getResidencial());
           	System.out.println("Telefone residencial: " + cliente.getTelefone().getCelular());
           	System.out.println("Email: ");
           	System.out.println("-------------------------------------");
           	
           	do {
           		System.out.print("Deseja alterar estes dados? S/N: ");
           		opcao = Read.next().toUpperCase().charAt(0);
           		if(opcao == 'S'){ // Verifica se o usuario deseja alterar os dados exibidos
           			apagaTela();
           			System.out.println("-------------------------------------");
           			System.out.print("Telefone residencial: ");
           	    	residencial = console.readLine().toUpperCase();
           	    	System.out.print("Telefone celular: ");
           	    	celular = console.readLine();
           	    	System.out.print("Email: ");
           	    	email = console.readLine();
           	    	
           	    	telefone = new Telefone(residencial, celular);
           			
           		} else if ( opcao == 'N') {
           			residencial = cliente.getTelefone().getResidencial();
           			celular = cliente.getTelefone().getCelular();
           			email = cliente.getEmail();
           			cont++;
           			telefone = new Telefone(residencial, celular);
           		} else {
           			System.out.println("Opcao invalida!");
           		}
           		
           	} while(opcao != 'S' && opcao != 'N');	
    	
    	boolean atualizado = fachadaCliente.atualizarCliente(cpf, new Cliente(nome, cpf, idade, sexo, endereco, telefone, email));
    		
    		if(atualizado && cont != 3){
    			System.out.println("--------------------------------------");
    			System.out.println("* Cliente atualizado com sucesso! press<<Enter>>");
    			console.readLine();
        		menuCliente();
    		} else if (cont >= 3) {
    			System.out.println(" Press <<Enter>>");
    			menuCliente();
    		} else {
    			System.out.println("* Erro ao atualizar! press <<Enter>>");
    			console.readLine();
        		menuCliente();
    		}
    		
    	} else {
    		System.out.println("* Cliente nao encontrado!  press<<Enter>>");
    		console.readLine();
    		menuCliente();
    	} // Termino do if principal
    	
    }
    
    private static void removerCliente(){
    	
    	System.out.println();
    	System.out.print("Digite o CPF do cliente: ");
    	String cpf = console.readLine();
    	Cliente c = fachadaCliente.buscarCliente(cpf);
    	if( c != null ){
    		apagaTela();
    		System.out.println("------------------------------------------------");
    		System.out.println("Cliente: " + c.getNome());
    		System.out.println("------------------------------------------------");
    		System.out.println("Deseja realmente remover? S/N");
    		 char opcao = Read.next().toUpperCase().charAt(0);
    		 if(opcao == 'S'){
    			 fachadaCliente.removerCliente(c);
    			 System.out.println("* Removido com sucesso! press <<Enter>>"); 
    			 console.readLine();
    		 } else if (opcao == 'N'){
    			 System.out.println("Press <<Enter>>");
    			 console.readLine();
    		 } else {
    			 System.out.println("* Opcao invalida! press <<Enter>>");
    			 console.readLine();
    		 }
    	} else {
    		System.out.println("* Cliente nao encontrado! press <<Enter>>");
    		console.readLine();
    	}
   
		menuCliente();  	
    }
    
    private static void removerDependente(){
    	
    	System.out.println();
    	System.out.print("Digite o CPF do titular: ");
    	String cpf = console.readLine();
    	
    	if(fachadaCliente.pesquisarCpf(cpf) && (fachadaCliente.buscarDependente(cpf).size() > 0)){
    		Vector<Dependente> dependentes = fachadaCliente.buscarDependente(cpf);
    		apagaTela();
    		System.out.println("------------------------------");
    		System.out.println("| ** LISTA DE DEPENDENTES ** |");
    		System.out.println("---------------------------------------------------------------");
    			for (int i = 0 ; i < dependentes.size() ; i++){
    				System.out.println("id: "+(i+1) + ".  " + dependentes.get(i).getNome() +
    						",  Parentesco: " + dependentes.get(i).getParentesco());
    				System.out.println("---------------------------------------------------------------");
    			}
    			System.out.print("Digite o id do dependente: ");
    			
    			String num = console.readLine();
    			int id = -1;
    				
    				try{ // Verificar se é realmente um numero
    						id = Integer.parseInt(num);
    						if( id < 1 || id > dependentes.size()){
    	    					System.out.println("* O id digitado nao e valido! press <<Enter>>");
    	    				}
    	    			
    	    				if(fachadaCliente.removerDependente(id - 1 )){
    	    					dependentes = fachadaCliente.buscarDependente(cpf);
    	    					apagaTela();
    	    		    		System.out.println("------------------------------");
    	    		    		System.out.println("| ** LISTA DE DEPENDENTES ** |");
    	    		    		System.out.println("---------------------------------------------------------------");
    	    		    			for (int i = 0 ; i < dependentes.size() ; i++){
    	    		    				System.out.println("id: "+(i+1) + "  " + dependentes.get(i).getNome() +
    	    		    						" / Parentesco: " + dependentes.get(i).getParentesco());
    	    		    				System.out.println("---------------------------------------------------------------");
    	    		    			}
    	    					System.out.println("* Removido com sucesso! press <<Enter>>");
    	    				} else {
    	    					System.out.println("* Falha ao remover! press <<Enter>>");
    	    				}
    				} catch (NumberFormatException e){
    					System.out.println("Id invalido! press <<Enter>>");
    				}
    			
    		
    	} else if (fachadaCliente.pesquisarCpf(cpf) && fachadaCliente.buscarDependente(cpf).size() == 0) {
    		System.out.println("* O cliente nao possui dependentes! press <<Enter>>");
    	} else {
    		System.out.println("* CPF nao encontrado! press <<Enter>>");
    	}
    	
    	console.readLine();
    	menuCliente();  	
    	
    }
    
}
